package com.controladores.controlvehicular;

import java.util.ArrayList;

import com.controladores.controlvehicular.R;
import com.controladores.controlvehicular.basededatos.GestorBaseDatos;
import com.controladores.controlvehicular.controlador.Posicion;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
/**
 * Clase que carga el mapa con la localización del usuario 
 * @author Luis Soto <lsantoniosoto@gmail.com>
 * @author Mariuxi Salinas <mariuxidelcisne@gmail.com>
 * @version 1.0, 11/04/2014
 */
public class Localizacion extends android.support.v4.app.FragmentActivity {
	GoogleMap mapaLocalizacion;
	private static double latitudVistaInicial = -3.9930435651614538;
	private static double longitudVistaInicial = -79.20223423413745;
	private transient String proveedor;
	private static final String TAG = "[SIMERT]";
	private LocationManager locationManager;
	private static double latitudUsuario;
	private static double longitudUsuario;
	private static Posicion controlPosicion;
	private String mostrarMapa;
	private String mostrarZona;
	private double puntosX[];
	private double puntosY[];
	private String nombreUsuario;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_localizacion);
		cargarMapa();

	}
/**
 * Inicializa los componentes y servicios para cargar el mapa y mostrar la ubicación
 */
	private void cargarMapa() {
		ArrayList<String> puntosZonas = new ArrayList<String>();
		puntosZonas = obtenerCoordenadasZonasTrabajo();
		puntosX = new double[puntosZonas.size()];
		puntosY = new double[puntosZonas.size()];
		for (int i = 0; i < puntosZonas.size(); i++) {
			String puntoLatLong[] = puntosZonas.get(i).split(",");
			puntosX[i] = Double.parseDouble(puntoLatLong[0]);
			puntosY[i] = Double.parseDouble(puntoLatLong[1]);
			System.out.println("latitudVistaInicial " + puntosX[i] + " " + "longitudVistaInicial "
					+ puntosY[i]);
		}
		obtenerCoordenadasZonasTrabajo();
		mapaLocalizacion = ((SupportMapFragment) getSupportFragmentManager()
				.findFragmentById(R.id.mapa)).getMap();
		LatLng vistaLoja = new LatLng(latitudVistaInicial, longitudVistaInicial);
		CameraPosition cp = new CameraPosition.Builder().target(vistaLoja)
				.zoom(16).build();
		CameraUpdate cu = CameraUpdateFactory.newCameraPosition(cp);
		mapaLocalizacion.animateCamera(cu);
		locationManager = (LocationManager) this
				.getSystemService(Context.LOCATION_SERVICE);
		proveedor = LocationManager.GPS_PROVIDER;
		Location location = locationManager.getLastKnownLocation(proveedor);

		if (null != location) {
			latitudUsuario = location.getLatitude();
			longitudUsuario = location.getLongitude();
			mostrarMarcador(latitudUsuario, longitudUsuario);
			Log.d(TAG, "Cargada|||||||| la localización.");
		} else {
			Toast.makeText(getBaseContext(),
					"No funciona location con locationmanager",
					Toast.LENGTH_LONG).show();
			Log.d(TAG, "Localizacion nula");
		}
		locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
				0, new MyLocationListener());

		try {
			Bundle datosItemMostrarMapa = getIntent().getExtras();
			mostrarMapa = datosItemMostrarMapa.getString("MostrarMapa");
			// Enviar de extra el nombre de usuario (controlador)
			if (mostrarMapa.compareTo("Mostrar mapa") != 0) {
				Intent aZonaC = new Intent(Localizacion.this,
						ZonasControl.class);
				startActivity(aZonaC);
			} else {
			}

		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("Error de item" + e);
		}
		try {
			Bundle datosZonas = getIntent().getExtras();
			mostrarZona = datosZonas.getString("IrZona");
			if (mostrarZona.compareTo("Ir a zona") == 0) {
				controlPosicion = new Posicion();
				GestorBaseDatos manejador = new GestorBaseDatos(
						Localizacion.this);
				nombreUsuario = "";
				try {
					manejador.abrirBaseDatos();
					nombreUsuario = manejador.consultarUsuario();
					manejador.close();
				} catch (Exception e) {
					//
					System.out.println(e);
					// System.out.println("zona");
				}
				// /encenderGPS();
				controlPosicion.recibirDatos(this, puntosX, puntosY,
						nombreUsuario);
				controlPosicion.execute();
				Intent aZonaC = new Intent(Localizacion.this,
						ZonasControl.class);
				startActivity(aZonaC);
			}
		} catch (Exception e) {
			//
			System.out.println(e);
		}
	}

	@Override
	protected void onPause() {
		super.onPause();
		}
	/**
	 * Obtiene el proceso en segundo plano en cuanto a la ubicación del usuario 
	 * @return Posicion objeto de tipo Posicion
	 */
	public static Posicion obtenerHiloEjecucion() {
		Posicion posicion = controlPosicion;
		return posicion;
	}
	/**
	 * Obtiene las coordenadas con respecto a la zona de trabajo 
	 * @return ArrayList<String> Lista de coordenadas
	 */
	public ArrayList<String> obtenerCoordenadasZonasTrabajo() {
		ArrayList<String> coordenadasZonas = new ArrayList<String>();
		GestorBaseDatos manejador1 = new GestorBaseDatos(Localizacion.this);
		manejador1.abrirBaseDatos();
		int id = 1;
		String horaInicio = manejador1.obtenerhoraInicioGeocerca(id);
		String coordenadasZonasTrabajo = "";
		coordenadasZonasTrabajo = manejador1.obtenerDatosGeocerca(horaInicio);
		manejador1.close();
		String puntos[] = coordenadasZonasTrabajo.split(";");
		for (int i = 0; i < puntos.length; i++) {
			coordenadasZonas.add(puntos[i]);
		}
		System.out.println("tamaño lista puntos metodo "
				+ coordenadasZonas.size());
		return coordenadasZonas;
	}

	/**
	 * Clase Interna que implementa LocationListener para detectar el cambio de localización geográfica 
	 * @author Luis Soto <lsantoniosoto@gmail.com>
	 * @author Mariuxi Salinas <mariuxidelcisne@gmail.com>
	 * @version 1.0, 11/04/2014
	 */
	public class MyLocationListener implements LocationListener {
		@Override
		public void onLocationChanged(Location loc) {
			latitudUsuario = loc.getLatitude();
			longitudUsuario = loc.getLongitude();
			mapaLocalizacion.clear();
			mostrarMarcador(latitudUsuario, longitudUsuario);
		}

		@Override
		public void onProviderDisabled(String provider) {
			// TODO Auto-generated method stub
			Toast.makeText(getBaseContext(), "Proveedor desconectado",
					Toast.LENGTH_LONG).show();
		}

		@Override
		public void onProviderEnabled(String provider) {
			// TODO Auto-generated method stub
			Toast.makeText(getBaseContext(), "Proveedor conectado",
					Toast.LENGTH_LONG).show();
		}

		@Override
		public void onStatusChanged(String provider, int status, Bundle extras) {
			// TODO Auto-generated method stub
		}
	}
	/**
	 * Muestra un marcador en la posición del usuario
	 * @param latitud Latitud 
	 * @param longitud Longitud
	 */
	public void mostrarMarcador(double latitud, double longitud) {
		// String posicionMostrar = lar
		mapaLocalizacion.addMarker(new MarkerOptions()
				.position(new LatLng(latitud, longitud)).title("Mi ubicación")
				.snippet(latitud + "latitudVistaInicial y longitudVistaInicial mm" + longitud));

	}

	public static String obtenerPosicion() {
		String posicion = latitudUsuario + "," + longitudUsuario;
		return posicion;
	}

/**
 * Añade puntos al polígono
 */
	/*public void poligono() {

		PolygonOptions opcionesPoligono = new PolygonOptions()
				.add(new LatLng(puntosX[0], puntosY[0]))
				.add(new LatLng(puntosX[1], puntosY[1]))
				.add(new LatLng(puntosX[2], puntosY[2]))
				.add(new LatLng(puntosX[3], puntosY[3]));

		// mapaLocalizacion.clear();
		Polygon poligono = mapaLocalizacion.addPolygon(opcionesPoligono);
		poligono.setFillColor(Color.YELLOW); // Relleno del pol??gono
		poligono.setStrokeColor(Color.GRAY); // Bordes del pol??gono

	}*/

	public String[] descomponerTrama(String punto, String separador) {
		String[] puntoXY = punto.split(separador);
		return puntoXY;
	}

}
